# uamcf/methods/base.py
from abc import ABC, abstractmethod
from typing import Dict, Any, Optional, List, Tuple, Union

from ..utils.logger import get_logger


class CompressionMethod(ABC):
    """所有压缩方法的基类，定义通用接口"""

    def __init__(self, config: Optional[Dict] = None):
        """
        初始化压缩方法

        Args:
            config: 方法配置参数
        """
        self.logger = get_logger(self.__class__.__name__)
        self.config = config or {}

    @abstractmethod
    def compress(self, layer: Any) -> Any:
        """
        压缩给定的层

        Args:
            layer: 要压缩的层

        Returns:
            压缩后的层
        """
        pass

    @abstractmethod
    def evaluate(self, original: Any, compressed: Any) -> Dict:
        """
        评估压缩前后的性能

        Args:
            original: 原始层
            compressed: 压缩后的层

        Returns:
            评估指标
        """
        pass

    def can_apply(self, layer_type: str) -> bool:
        """
        检查该压缩方法是否适用于特定类型的层

        Args:
            layer_type: 层的类型

        Returns:
            是否适用
        """
        return True

    @classmethod
    def get_default_params(cls) -> Dict:
        """
        获取该压缩方法的默认参数

        Returns:
            默认参数字典
        """
        return {}

    def get_expected_metrics(self, layer_info: Dict) -> Dict:
        """
        获取应用该压缩方法的预期影响

        Args:
            layer_info: 层的信息

        Returns:
            预期的性能指标变化
        """
        return {
            "accuracy_ratio": 1.0,  # 精度保持率，1.0表示无损失
            "size_ratio": 1.0,  # 大小减少率，1.0表示无减少
            "latency_ratio": 1.0,  # 延迟改进率，1.0表示无改进
            "memory_ratio": 1.0  # 内存减少率，1.0表示无减少
        }